Function.prototype.mycall = function (thisArg, ...args) {
  var fn = this;

  thisArg = thisArg !== null && this !== undefined ? Object(thisArg) : window;

  thisArg.fn = fn;
  var result = thisArg.fn(...args);
  delete thisArg.fn;

  return result;
};

function foo() {
  console.log("foo函数被执行", this);
}

function sum(num1, num2) {
  console.log("sum函数被执行", this, num1, num2);
  return num1 + num2;
}

// 系统的函数的call方法
foo.call(undefined);
var result = sum.call({}, 20, 30);
// console.log("系统调用的结果:", result)

// 自己实现的函数的mycall方法
// 默认进行隐式绑定
// foo.myall({name: "why"})
foo.mycall(undefined);
var result = sum.mycall("abc", 20, 30);
console.log("hycall的调用:", result);
